from django.shortcuts import render
from rest_framework.views import APIView
from apps.oaauth.serializers import LoginSerializer,UserSerializer
from datetime import datetime
from .authentications import generate_jwt
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated

class LoginView(APIView):
    def post(self, request):
        #1.验证数据是否可用
        serializer = LoginSerializer(data=request.data) #创建一个 LoginSerializer 实例，并传递请求数据作为参数
        # request.data :<QueryDict: {'email': ['dongdong@qq.com'], 'password': ['111111']}>
        if serializer.is_valid():
            user = serializer.validated_data['user'] #这个user是从serializers.py中attrs['user'] = user绑定到arrts中的用户对象
            #这个user是一个用户模型的实例化 <class 'apps.oaauth.models.OAUser'>
            user.last_login = datetime.now() #修改数据库中的上次登录时间
            user.save()
            token = generate_jwt(user) #并将用户对象传递给 generate_jwt 函数,生成token令牌
            return Response({'token': token,'user':UserSerializer(user).data}) #返回一个包含 JWT 令牌的响应
        else:
            #[[ErrorDetail(string='密码错误！', code='invalid')]]
            detail = list(serializer.errors.values())[0][0] #获取真正的错误消息
            #drf在返回响应式非200时，错误参数名为detail,保持一致也改成detail
            return Response({'detail': detail}, status=status.HTTP_400_BAD_REQUEST)

from .serializers import ResetPwdSerializer  #导入定义的序列器
from rest_framework import status
class ResetPwdView(APIView):  #用于处理修改密码的视图类
    #permission_classes = [IsAuthenticated]  #单独非全局的认证  表示必须要登录才能使用该视图函数
    def post(self, request): #处理post请求
        #request：是DRF封装的 rest_framework.request.Request：针对django的HttpResponse对象进行封装
        #此处的request接受了认证类返回绑定的的数据
        # print(request)
        # print(request.user)
        serializer = ResetPwdSerializer(data=request.data,context={'request':request})
        #创建一个序列实例，将发送的请求request.data作为数据源    context表示传递额外数据给序列化器
        if serializer.is_valid(): #符合序列化器的字段定义
            #print(serializer.validated_data)  {'oldpwd': '111111', 'pwd1': '123456', 'pwd2': '123456'}

            pwd1 = serializer.validated_data['pwd1'] #提取用户输入的新密码
            request.user.set_password(pwd1) #更改密码
            request.user.save()  #保存数据库用户对象
            return Response()
        else:
            print(serializer.errors) #{'non_field_errors': [ErrorDetail(string='旧密码错误！', code='invalid')]}
            detail = list(serializer.errors.values())[0][0] #提取序列化器的报错信息 ：ErrorDetail对象被转换为字符串时，通常会显示其string属性（旧密码错误）
            return Response({'detail':detail},status=status.HTTP_400_BAD_REQUEST)
